#include <bitset>
#include <iostream>

// 宏定义在此插入

#define SENSEDRIVER_MODULE_DISABLE_ALL (0)    //! < disable all modules
#define SENSEDRIVER_MODULE_FACEATTR (1u << 0) //! < enable face attribute module
#define SENSEDRIVER_MODULE_FACEEMOTION                                         \
  (1u << 1)                                     //! < enable face emotion module
#define SENSEDRIVER_MODULE_DROWSINESS (1u << 2) //! < enable drowsiness module
#define SENSEDRIVER_MODULE_DISTRACTION (1u << 3) //! < enable distraction module
#define SENSEDRIVER_MODULE_AOI (1u << 4)         //! < enable aoi module
#define SENSEDRIVER_MODULE_ACTION (1u << 5)      //! < enable action module
#define SENSEDRIVER_MODULE_VERIFY (1u << 6)      //! < enable verify module
#define SENSEDRIVER_MODULE_DRIVERMISSING                                       \
  (1u << 7) //! < enable drivermissing module
#define SENSEDRIVER_MODULE_CAMERAOCCLUSION                                     \
  (1u << 8) //! < enable cameraocclusion module
#define SENSEDRIVER_MODULE_ENABLE_ALL ((1u << 9) - 1U) //! < enable all modules

//启用某个模块 要启用一个模块，可以使用按位或 (|) 操作符。
void doUp() {
  unsigned int modules = SENSEDRIVER_MODULE_DISABLE_ALL; // 初始时禁用所有模块

  // 启用FACEATTR和FACEEMOTION模块
  modules |= SENSEDRIVER_MODULE_FACEATTR;
  modules |= SENSEDRIVER_MODULE_FACEEMOTION;

  std::cout << "Enabled modules: " << std::bitset<16>(modules) << std::endl;

  return;
}

//禁用某个模块 要禁用一个模块，可以使用按位与 (&) 和位的按位取反 (~) 操作符。
void doDown() {
  unsigned int modules = SENSEDRIVER_MODULE_ENABLE_ALL; // 初始时启用所有模块

  // 禁用FACEATTR和FACEEMOTION模块
  modules &= ~SENSEDRIVER_MODULE_FACEATTR;
  modules &= ~SENSEDRIVER_MODULE_FACEEMOTION;

  std::cout << "Enabled modules: " << std::bitset<16>(modules) << std::endl;
}

//切换某个模块的状态
//要切换一个模块的状态（如果启用则禁用，如果禁用则启用），可以使用按位异或 (^)
//操作符。
void doSwitch() {
  unsigned int modules =
      SENSEDRIVER_MODULE_FACEATTR |
      SENSEDRIVER_MODULE_FACEEMOTION; // 初始时启用FACEATTR和FACEEMOTION模块

  // 切换FACEATTR和FACEEMOTION模块的状态
  modules ^= SENSEDRIVER_MODULE_FACEATTR;
  modules ^= SENSEDRIVER_MODULE_FACEEMOTION;

  std::cout << "Enabled modules: " << std::bitset<16>(modules) << std::endl;
}

//检查某个模块是否被启用 要检查某个模块是否被启用，可以使用按位与 (&) 操作符。
void doCheckStatus() {
  unsigned int modules =
      SENSEDRIVER_MODULE_FACEATTR |
      SENSEDRIVER_MODULE_FACEEMOTION; // 初始时启用FACEATTR和FACEEMOTION模块

  // 检查FACEATTR和FACEEMOTION模块是否被启用
  bool isFaceAttrEnabled = modules & SENSEDRIVER_MODULE_FACEATTR;
  bool isFaceEmotionEnabled = modules & SENSEDRIVER_MODULE_FACEEMOTION;

  std::cout << "FACEATTR module is "
            << (isFaceAttrEnabled ? "enabled" : "disabled") << std::endl;
  std::cout << "FACEEMOTION module is "
            << (isFaceEmotionEnabled ? "enabled" : "disabled") << std::endl;
}

int main() {
  //启用示例
  doUp();

  doDown();

  doSwitch();

  doCheckStatus();

  return 0;
}
